home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 6
/
FM Towns Free Software Collection 6.iso
/
t_os
/
book
/
src
/
lib.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-07-08
|
6KB
|
269 lines
/*
* 一般的な関数
* -------------- -- ---------------------------
* 91/04/14 03:22 01 get_fsize()
* 91/04/26 21:32 02 kstrlen()
* 91/05/27 18:28 03 strdup()
* 91/05/30 17:27 04 center()
* 91/06/25 00:38 05 iswap()
* 92/06/11 14:27 06 jstrrchr()
*/
#include <stdio.h>
#include <stdefs.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "sugi.h"
#include "lib.h"
#define iskanji(c) ((0x81 <= c && c <= 0x9f) || (0xe0 <= c && c <= 0xfc))
#define iskanji2(c) ((0x40 <= c && c <= 0x7e) || (0x80 <= c && c <= 0xfc))
/* 文字列中のスペース/スペース以外を飛ばす */
char *skipbl( char *str ) /* 先頭のスペースをとばす */
{
while( *str && isspace( *str ) ) str ++ ;
return str ;
}
char *skipwd( char *str ) /* 先頭の文字をとばす */
{
while( *str && !isspace( *str ) ) str ++ ;
return str ;
}
/* 指定のファイル・ポインタの指すファイルの大きさを返す */
#ifndef get_fsize
long get_fsize( FILE *fp )
{
long now, fsize ;
now = ftell( fp ) ;
fseek( fp, 0L, SEEK_END ) ;
fsize = ftell( fp ) ;
fseek( fp, now, SEEK_SET ) ;
return( fsize ) ;
}
#endif
/* コピー先を確保し、文字列をコピーする */
#ifndef strdup
char *strdup( const char *str )
{
REGS char *p ;
if( ( p = (char *)malloc( strlen( str )+1 ) ) != NULL )
strcpy( p, str ) ;
return p ;
}
#endif
/* センタリングする */
char *center( char *str, int width )
{
static char buf[ 256 ] ;
auto int i, len, left ;
left = ( width - ( len = strlen( str ) ) ) / 2 ;
if( left*2 + len != width )
left ++ ;
for( i = 0 ; i < left ; i ++ )
buf[ i ] = ' ' ;
strcpy( &buf[ left ], (char *)str ) ;
return( buf ) ;
}
/* 整数を交換する */
void iswap( int *a, int *b )
{
int c ;
c = *a ;
*a = *b ;
*b = c ;
}
/* シフトJISを考慮し、英大小文字を区別せずに指定データを比較する */
int jmemicmp( const char *s1, const char *s2, size_t len )
{
int i, ret ;
for( i = 0 ; i < len ; i++, s1++, s2++ )
{
if( iskanji( *s1 ) )
{
if( ( ret = *s1 - *s2 ) != 0 )
break ;
else if( iskanji2( *(s1+1) ) )
{
if( ( ret = *(s1+1) - *(s2+1) ) != 0 )
break ;
else
s1++, s2++, i++ ;
}
}
else if( ( ret = tolower( *s1 ) - tolower( *s2 ) ) != 0 )
break ;
}
return ret ;
}
/* シフトJISを考慮して、英小文字をすべて大文字にする */
char *jstrupr( char *str )
{
REGS char *p ;
for( p = str ; *p != '\0' ; p ++ )
if( iskanji( *p ) && iskanji2( *(p+1) ) )
p ++ ;
else
*p = toupper( *p ) ;
return str ;
}
/* シフトJIS文字も1文字として数えるstrlen */
size_t jstrlen( const char *str )
{
const char *p ;
size_t len = 0 ;
for( p = str ; *p != '\0' ; p ++, len ++ )
if( iskanji( *p ) && iskanji2( *(p+1) ) )
p ++ ;
return( len ) ;
}
/* シフトJISを考慮して、文字列を前から検索する */
char *jstrchr( const char *p, int ch )
{
if( p != NULL )
for( ; *p != '\0' ; p ++ )
{
if( iskanji( *p ) && iskanji2( *(p+1) ) )
p ++ ;
else if( *p == ch )
return (char *)p ;
}
return NULL ;
}
/* シフトJISを考慮して、文字列を後ろから検索する */
char *jstrrchr( const char *str, int ch )
{
const char *last = NULL ;
if( str == NULL )
return NULL ;
while( 1 )
{
if( ( str = jstrchr( str, ch ) ) != NULL )
last = str, str++ ;
else
return (char *)last ;
}
}
/*
* printf( "%-*s", column, str ) を代替する
*/
char *formstrL( char *str, int column )
{
static char buf[256] ;
auto int i, len ;
len = strlen( strcpy( buf, str ) ) ;
for( i = len ; i < column ; i ++ )
buf[i] = ' ' ;
buf[i] = '\0' ;
return buf ;
}
/*
* printf( "%*s", column, str ) を代替する
*/
char *formstrR( char *str, int column )
{
static char buf[256] ;
auto int i, len ;
len = column - strlen( str ) ;
for( i = 0 ; i < len ; i ++ )
buf[i] = ' ' ;
buf[i] = '\0' ;
strcat( buf, str ) ;
return buf ;
}
/*
* printf( "%*d", value, column ) を代替する
*/
static char *formdigit( int value, int column, int zerosuppres )
{
static char buf[32] ;
auto char buf2[32] ;
auto int i, len ;
len = column - strlen( _itoa( value, buf2, 10 ) ) ;
if( zerosuppres )
{
for( i = 0 ; i < len ; i ++ )
buf[i] = '0' ;
buf[i] = '\0' ;
strcat( buf, buf2 ) ;
}
else
strcpy( buf, buf2 ) ;
return buf ;
}
char *formdigitR( int value, int column, int zerosuppres )
{
auto char *str ;
str = formdigit( value, column, zerosuppres ) ;
return formstrR( str, column ) ;
}
char *formdigitL( int value, int column, int zerosuppres )
{
auto char *str ;
str = formdigit( value, column, zerosuppres ) ;
return formstrL( str, column ) ;
}